# -*- coding: utf-8 -*-
# for python3
'''
@file  download_url.py
@brief 指定した設定ファイルのルールに基づき、web からファイルをダウンロードする

Created on 2011/06/14

@author: yohei

@usage
python3 download_url.py -i 設定ファイルパス -o 保存先フォルダ

設定ファイルの記述例
[
	{"url": "http://.....", "params":{"name":"user000", "pass":"password"},"encode":"euc_jp"},
				:
				:
]
'''
import codecs
import http.cookiejar
import json
from optparse import OptionParser
import os.path
import re
import sys
import urllib.parse
import urllib.request

HTTP_HEADER_USER_AGENT='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; ja-jp) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'
HTTP_HEADER_ACCEPT='application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'
HTTP_HEADER_ACCEPT_LANGUAGE='ja-jp'

def main(argv):
	# オプション解析
	parser = OptionParser('parse favorite url')
	parser.add_option('-i', '--input', action='append', type='string', dest='in_paths', help='input path (multi able)')
	parser.add_option('-o', '--output', action='store', type='string', dest='out_path', help='output path')
	(options, args) = parser.parse_args(argv)

	# オプションエラーチェック
	if not options.in_paths or len(options.in_paths) == 0:
		parser.print_help()
		parser.error('引数 -i が指定されていない')

	if not options.out_path:
		parser.print_help()
		parse.error('引数 -o が指定されていない')

	# opener 作成
	httphandler = urllib.request.HTTPHandler()

	cj = http.cookiejar.CookieJar()
	cookieprocessor = urllib.request.HTTPCookieProcessor(cj)

	opener = urllib.request.build_opener(httphandler, cookieprocessor)
	opener.addheaders = [
			('User-agent', HTTP_HEADER_USER_AGENT),
			('Accept', HTTP_HEADER_ACCEPT),
			('Accept-Language', HTTP_HEADER_ACCEPT_LANGUAGE)
			]

	for in_path in options.in_paths:	
		# json 読み込む
		f = codecs.open(in_path, 'r', 'utf-8')
		in_datas = json.load(f)
		f.close()
		
		# 設定に基づき、一つずつ
		for in_data in in_datas:
			url = in_data['url']
			data = urllib.parse.urlencode(in_data['params'])
			data = data.encode('utf-8')
			response = opener.open(url, data)
			httpdata = response.read()
			if False:
				print(httpdata.decode(in_data['encode']))
			
			f = open(os.path.join(options.out_path,in_data['filename']), 'wb')
			f.write(httpdata)
			f.close()
	
if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    main(sys.argv)
